- *
-
@ now always interpolates an array in double-quotish strings. Some programs
may now need to use backslash to protect any @ that shouldn't interpolate.
- *
-
Barewords that used to look like strings to Perl will now look like subroutine
calls if a subroutine by that name is defined before the compiler sees them.
For example:
sub SeeYa { die "Hasta la vista, baby!" }
$SIG{'QUIT'} = SeeYa;
In Perl 4, that set the signal handler; in Perl 5, it actually calls the
function! You may use the -w switch to find such places.
- *
-
Symbols starting with _ are no longer forced into package main, except
for $_ itself (and @_, etc.).
- *
-
Double-colon is now a valid package separator in an identifier. Thus these
behave differently in perl4 vs. perl5:
print "$a::$b::$c\n";
print "$var::abc::xyz\n";
- *
-
s'$lhs'$rhs' now does no interpolation on either side. It used to
interpolate $lhs but not $rhs.
- *
-
The second and third arguments of splice() are now evaluated in scalar
context (as the book says) rather than list context.
- *
-
These are now semantic errors because of precedence:
shift @list + 20;
$n = keys %map + 20;
Because if that were to work, then this couldn't:
sleep $dormancy + 20;
- *
-
The precedence of assignment operators is now the same as the precedence
of assignment. Perl 4 mistakenly gave them the precedence of the associated
operator. So you now must parenthesize them in expressions like
/foo/ ? ($a += 2) : ($a -= 2);
Otherwise
/foo/ ? $a += 2 : $a -= 2;
would be erroneously parsed as
(/foo/ ? $a += 2 : $a) -= 2;
On the other hand,
$a += /foo/ ? 1 : 2;
now works as a C programmer would expect.
- *
-
open FOO || die is now incorrect. You need parens around the filehandle.
While temporarily supported, using such a construct will
generate a non-fatal (but non-suppressible) warning.
- *
-
The elements of argument lists for formats are now evaluated in list
context. This means you can interpolate list values now.
- *
-
You can't do a goto into a block that is optimized away. Darn.
- *
-
It is no longer syntactically legal to use whitespace as the name
of a variable, or as a delimiter for any kind of quote construct.
Double darn.
- *
-
The caller() function now returns a false value in a scalar context if there
is no caller. This lets library files determine if they're being required.
- *
-
m//g now attaches its state to the searched string rather than the
regular expression.
- *
-
reverse is no longer allowed as the name of a sort subroutine.
- *
-
taintperl is no longer a separate executable. There is now a -T
switch to turn on tainting when it isn't turned on automatically.
- *
-
Double-quoted strings may no longer end with an unescaped $ or @.
- *
-
The archaic while/if BLOCK BLOCK syntax is no longer supported.
- *
-
Negative array subscripts now count from the end of the array.
- *
-
The comma operator in a scalar context is now guaranteed to give a
scalar context to its arguments.
- *
-
The ** operator now binds more tightly than unary minus.
It was documented to work this way before, but didn't.
- *
-
Setting $#array lower now discards array elements.
- *
-
delete() is not guaranteed to return the old value for tie()d arrays,
since this capability may be onerous for some modules to implement.
- *
-
The construct ``this is $$x'' used to interpolate the pid at that
point, but now tries to dereference $x. $$ by itself still
works fine, however.
- *
-
The meaning of foreach has changed slightly when it is iterating over a
list which is not an array. This used to assign the list to a
temporary array, but no longer does so (for efficiency). This means
that you'll now be iterating over the actual values, not over copies of
the values. Modifications to the loop variable can change the original
values. To retain Perl 4 semantics you need to assign your list
explicitly to a temporary array and then iterate over that. For
example, you might need to change
foreach $var (grep /x/, @list) { ... }
to
foreach $var (my @tmp = grep /x/, @list) { ... }
Otherwise changing $var will clobber the values of @list. (This most often
happens when you use $_ for the loop variable, and call subroutines in
the loop that don't properly localize $_.)
- *
-
Some error messages will be different.
- *
-
Some bugs may have been inadvertently removed.